package org.xx.armory.spring5.security;

import org.springframework.security.core.GrantedAuthority;

import java.util.Collection;
import java.util.Set;

import static org.springframework.security.core.authority.AuthorityUtils.authorityListToSet;

public final class SecurityUtils {
    private SecurityUtils() {
        throw new AssertionError();
    }

    /**
     * 判断指定的权限列表是否和期望的权限名称完全一致（忽视顺序）。
     *
     * @param actual
     *         指定的权限列表。
     * @param expected
     *         期望的权限。
     * @return 是否完全一致。
     * @throws NullPointerException
     *         如果参数{@code expected}是{@code null}。
     */
    public static boolean matchExactly(
            Collection<? extends GrantedAuthority> actual,
            String... expected
    ) {
        if (actual == null || actual.isEmpty()) {
            return expected.length == 0;
        }

        return authorityListToSet(actual).equals(Set.of(expected));
    }

    /**
     * 判断指定的权限列表是否包含所有期望的权限名称（忽视顺序）。
     *
     * @param actual
     *         指定的权限列表。
     * @param expected
     *         期望的权限。
     * @return 是否包含期望的权限。
     * @throws NullPointerException
     *         如果参数{@code expected}是{@code null}。
     */
    public static boolean match(
            Collection<? extends GrantedAuthority> actual,
            String... expected
    ) {
        if (actual == null || actual.isEmpty()) {
            return expected.length == 0;
        }

        return authorityListToSet(actual).containsAll(Set.of(expected));
    }
}
